#include <stdlib.h>
#include <iostream>
#include <string>

#include <SignalHandler.h>
#include "model/signalHandlers/INTERRUPT_Handler.h"
#include "model/signalHandlers/EXITCHILD_Handler.h"
#include "view/MenuPrincipal.h"
#include "view/MenuStack.h"
#include "model/Usuario.h"
#include "model/Entorno.h"
#include "Log.h"

#include <list>

using namespace std;

#define OPCION_SALIR 5

void evaluarParametrosActivados(int argc,char** argv,int vectorDeParametros[][2])
{
	int i,j;

	/*Se inicializa en false el vector*/
	for(i=0;i<6;i++)
	 for(j=0;j<2;j++) vectorDeParametros[i][j]=0;

	/*Si el parametro se encuentra repetido se tomara el primero,
	los parametros no validos seran ignorados*/
	for(i=1;i<argc;i++)
	{
  		if( (!strcmp(argv[i],"-u") || !strcmp(argv[i],"--usuario")) && !vectorDeParametros[0][0] ) {
  			if (i+1 < argc) {
				vectorDeParametros[0][0]=1;
				vectorDeParametros[0][1]=i+1;
  			}
        }

  		if( (!strcmp(argv[i],"-v") || !strcmp(argv[i],"--verbose")) && !vectorDeParametros[1][0] ) {
			vectorDeParametros[1][0]=1;
			vectorDeParametros[1][1]=i;
		}

  		if( (!strcmp(argv[i],"-h") || !strcmp(argv[i],"--help")) && !vectorDeParametros[2][0] ) {
			vectorDeParametros[2][0]=1;
			vectorDeParametros[2][1]=i;
		}
	}
}

void mostrarAyuda(){
	cout << "ConcuShare" << endl;
	cout << "----------" << endl;
	cout << "Ayuda:" << endl;
	cout << "  Comando: ConcuShare -u <USUARIO> [opciones]" << endl;
	cout << "  Opciones:  -v,--verbose    Crea archivo de debug del usuario." << endl;
	cout << "             -h,--help       Muestra esta ayuda." << endl;
}

int main (int argc, char** argv){
	{
		// event handler para la senial SIGINT (-2)
		INTERRUPT_Handler interrupt_handler;

		// se registra el event handler declarado antes
		SignalHandler::getInstance()->registrarHandler ( INTERRUPT_SIGNAL,&interrupt_handler );

		/*
		 * parametros activados
		 * --------------------
		 * parametrosActivados[0] ---> -u (usuario)
		 * parametrosActivados[1] ---> -v (verbose)
		 * parametrosActivados[2] ---> -h (ayuda)
		 */
		int parametrosActivados [3][2];

		evaluarParametrosActivados(argc,argv,parametrosActivados);

		if (!parametrosActivados[0][0]) {
			mostrarAyuda();
			exit(1);
		}

		if(parametrosActivados[2][0]) {
			mostrarAyuda();
			exit(0);
		}

		/********** fin lectura parámetros **********/

		Usuario* yo = Usuario::getInstance();
		yo->setNombre(argv[parametrosActivados[0][1]]);

		Log *log = Log::getInstance();
		if (parametrosActivados[1][0]) {
			log->inicializar(yo->getNombre());
		}

		MenuPrincipal* menuPrincipal = new MenuPrincipal();
		MenuStack* menuStack = MenuStack::getInstance();
		menuStack->push(menuPrincipal);

		Entorno* entorno = Entorno::getInstance();
		if (entorno->agregarUsuario(yo) == 1) {
			cout << "Es imposible registrar al usuario. Intente más tarde." << endl;
			menuStack->pop();
		}

		while (!menuStack->empty()) {
			system("clear");
			cout << "ConcuShare" << endl;
			cout << "----------" << endl << endl;
			menuStack->getCurrent()->update();
		}


		if (!yo->exitChild()){
			yo->terminarTransferencias();
			entorno->eliminarUsuario();
		}
		entorno->destroy();

		yo->destroy();
		if(log != NULL){
			log->destroy();
		}

		menuStack->destroy();
		SignalHandler::getInstance()->removerHandler(INTERRUPT_SIGNAL);
		SignalHandler::getInstance()->removerHandler(EXITCHILD_SIGNAL);
		SignalHandler::getInstance()->destruir();
	}
	return 0;
}
